/*
* 问题描述：在银行排队有一条黄线，在顾客来的时候如果黄内有位置，那么顾客会按照各个窗口队伍长度为最高优先级，序号为第二优先级进入黄线，否则
*         就在黄线后等待，求每个顾客的结束自己业务的准确时间，银行在8：00开门
*
* 输入：N 窗口个数 M 黄线前的最大容量 K 顾客总数 Q 请求的个数
*      K行 顾客的业务需要的时间
*      Q行 询问的顾客编号
*
* 输出：在17：00后的输出sorry，在之前的输出准确时间 
*
* 思路：在黄线前容量未满的时候，先将用户无脑填充，还有多客户的每次找到一个最先结束业务的窗口队首离开进入队末排队，将所有客户安置好位置后进
*      行最后的流水线执行，输出时比较开始时间和17:00之间的先后 
* 
* 一直部分错误的原因：在17：00前开始的业务即使在17：00后才结束也应该算（WTF... ）
*
*/
#include <iostream>
#include <vector>
#include <queue>
#include <list>
#include <string>
#include <sstream>
#include <climits>
using namespace std;
int N, M, K, Q;
struct customer{
    int id;
    int totaltime;
    int starttime;
    int endtime;
};
struct window{
    list<customer> line;
};
vector<customer> customers;
vector<window> windows;

//将黄线前的用户分派好
void dispatchCustomer(vector<customer> &customers){
    //人数可能比黄线前的容量小
    if(customers.size() >= M*N){
        for (int i = 0; i<M*N; i++){
            windows[i % N].line.push_back(customers[i]);
        }
    }else{
        for (int i = 0; i<customers.size(); i++){
            windows[i % N].line.push_back(customers[i]);
        }
    }

};

int findFitWindow(int &currentTime){
    int min = INT_MAX;
    int minIndex = -1;

    for (int i = 0; i<windows.size(); i++){
        if (windows[i].line.size() < M){
            return i;
        }
        if (windows[i].line.front().totaltime < min){
            min = windows[i].line.front().totaltime;
            minIndex = i;
        }
    }
    currentTime += min;
    for (int i = 0; i<windows.size(); i++){
        windows[i].line.front().totaltime -= min;
        if (windows[i].line.front().totaltime == 0) {
            customers[windows[i].line.front().id - 1].endtime = currentTime;
            windows[i].line.pop_front();
        }
    }
    return minIndex;
}

void finishRest(int currentTime){

    for (int i = 0; i<windows.size(); i++){
        int tmpTime = currentTime;
        //用for就会出错
        while (!windows[i].line.empty()){
            tmpTime += windows[i].line.front().totaltime;
            customers[windows[i].line.front().id - 1].endtime = tmpTime;
            windows[i].line.pop_front();
        }
    }
}

string formatTime(int endtime, int totaltime){
    //结束时间-消耗时间 = 开始时间 在17：00之后的才需要输出Sorry
    if (endtime - totaltime >= 1020){
        return "Sorry";
    }
    int hour = endtime / 60;
    int minute = endtime % 60;
    string result;
    stringstream ss;
    if (hour <= 9){
        ss << "0";
    }
    ss << hour << ":";

    if (minute <= 9){
        ss << "0";
    }
    ss << minute;
    ss >> result;
    return result;
}

void initWindows(int size){
    for (int i = 0; i<size; i++){
        window w;
        windows.push_back(w);
    }
}
int main() {
    cin >> N >> M >> K >> Q;
    initWindows(N);
    for (int i = 0; i<K; i++){
        customer c;
        c.id = i + 1;
        cin >> c.totaltime;
        customers.push_back(c);
    }
    dispatchCustomer(customers);

    int currentTime = 480;
    for (int i = N * M; i < K; i++) {
        int windowNum = findFitWindow(currentTime);
        windows[windowNum].line.push_back(customers[i]);
    }
    finishRest(currentTime);
    int customerId = 0;
    while (Q--){
        cin >> customerId;
        cout << formatTime(customers[customerId - 1].endtime,customers[customerId - 1].totaltime) << endl;
    }
    return 0;
}